home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / z150_src.lzh / ZOO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-07-12  |  9.0 KB  |  291 lines

  1. #ifndef LINT
  2. /* @(#) zoo.c 1.19 87/05/30 15:03:53 */
  3. static char sccsid[]="@(#) zoo.c 1.19 87/05/30 15:03:53";
  4. #endif /* LINT */
  5.  
  6. extern char version[];
  7.  
  8. /*
  9. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  10. */
  11. #include "options.h"
  12. #include <stdio.h>
  13. #include "various.h"
  14.  
  15. #include "zoo.h"
  16. #include "zoofns.h"
  17.  
  18. #include "errors.i"
  19. #include "zoomem.h"
  20.  
  21. #ifdef DEBUG
  22. int verbose = 0;
  23. #endif
  24.  
  25. char *out_buf_adr;      /* points to memory allocated for output buffer(s) */
  26. char *in_buf_adr;       /* points to memory allocated for input buffer */
  27.  
  28. /* static declarations */
  29. int quiet = 0;             /* whether to be quiet */
  30. int next_arg = FIRST_ARG; /* filenames start at this position */
  31. int arg_count;          /* count of arguments supplied to program */
  32. char **arg_vector;      /* vector of arguments supplied to program */
  33.  
  34. /* Suppress loading of some Microsoft C library routines. */
  35. #ifdef NDEBUG
  36. #ifndef PORTABLE
  37. _nullcheck() {}         /* prevent loading of Microsoft's null ptr check */
  38. #endif
  39. #endif
  40.  
  41. #ifndef PORTABLE
  42. _setenvp() {}           /* prevent loading of Microsoft's _setenvp */
  43. #endif
  44.  
  45. main(argc,argv)
  46. register int argc;
  47. register char **argv;
  48. {
  49.    char *zooname;          /* synonym for argv[2] -- to make life easier */
  50. #ifndef OOZ
  51.    static char incorrect_args[] = "Incorrect number of arguments.\n";
  52.    int filecount;          /* how many filespecs supplied */
  53. #endif /* OOZ */
  54.  
  55. #ifdef OOZ
  56. #else
  57. /* else not OOZ */
  58.       static char usage[] = "Usage: zoo {acDelLPTuUvx}[acdEfInMNoOpPquz1:/.] archive file (\"zoo h\" for help)\n";
  59.       static char nov_usage[] = 
  60.           "\nNovice usage:  zoo -cmd archive[.zoo] file...  where -cmd is one of these:\n";
  61.       char *option;
  62.  
  63.       static char nov_cmds[] = 
  64.          /* ADD=0EXT=5    MOV=14TES=20PRI=26 DEL=33  LIS=41UPD=47  FRE=55   COMMENT=64 */
  65.            "-add -extract -move -test -print -delete -list -update -freshen -comment\n";
  66.  
  67. #ifdef NOENUM
  68. #define NONE   -1
  69. #define ADD    0
  70. #define EXTRACT 5
  71. #define MOVE   14
  72. #define TEST   20
  73. #define PRINT  26
  74. #define DELETE 33
  75. #define LIST   41
  76. #define UPDATE 47
  77. #define FRESHEN   55
  78. #define COMMENT   64
  79.  
  80. int cmd = NONE;
  81.  
  82. #else
  83.    enum choice {
  84.       NONE=-1, ADD=0, EXTRACT=5, MOVE=14, TEST=20, PRINT=26, 
  85.       DELETE=33, LIST=41, UPDATE=47, FRESHEN=55, COMMENT=64
  86.    };
  87.    enum choice cmd = NONE;          /* assume no Novice command */
  88. #endif
  89.  
  90. #endif /* end of not OOZ */
  91.  
  92.    arg_count = argc;
  93.    arg_vector = argv;
  94.    zooname = argv[FIRST_ARG-1];     /* points to name or archive */
  95.  
  96. #ifdef OOZ
  97.    if (argc < 2) {
  98.       putstr (usage1);
  99.       putstr (usage2);
  100.       exit (1);
  101.    }
  102. #else
  103. /* else not OOZ */
  104.    if (argc < 2)
  105.       goto show_usage;
  106.    filecount = argc - 3;
  107.    option = strdup(argv[1]);
  108.  
  109. #ifdef DEBUG
  110.    if (*option == ':') {         /* for debugging output */
  111.       verbose++;
  112.       option++;                  /* hide the $ from other functions */
  113.    }
  114. #endif
  115.  
  116.    if (*option == 'h' || *option == 'H')
  117.       goto bigusage;
  118.     if (strchr("-acDelLPTuUvx", *option) == NULL)
  119.         goto give_list;
  120.  
  121.    if (*option == '-') {
  122.  
  123. #ifdef NOENUM
  124.       cmd = instr (nov_cmds, strlwr(option));
  125. #else
  126.       cmd = (enum choice) instr (nov_cmds, strlwr(option));
  127. #endif
  128.  
  129.       if (strlen(option) < 2 || cmd == NONE)
  130.          goto show_usage;
  131.       if (  ((cmd == ADD || cmd == MOVE || cmd == FRESHEN || 
  132.                   cmd == UPDATE || cmd == DELETE) && argc < 4) ||
  133.             ((cmd == EXTRACT || cmd == TEST || cmd == LIST ||
  134.                      cmd == PRINT || cmd == COMMENT) && argc < 3)) {
  135.          fprintf (stderr, incorrect_args);
  136.          goto show_usage;
  137.       }
  138.    } else {
  139.         char *wheresI;        /* will be null if I option not supplied */
  140.         if    (
  141.                 (
  142.                     strchr("au",*option) && 
  143.                     (
  144.                         ((wheresI = strchr(option,'I')) && argc != 3) ||
  145.                         wheresI==NULL && argc < 4
  146.                     )
  147.                 ) ||
  148.                  strchr("DU",*option) && argc < 4 ||
  149.              strchr("cexlvL",*option) && argc < 3 ||
  150.              strchr("TP",*option)   && argc != 3
  151.             ) {
  152.          fprintf (stderr, incorrect_args);
  153.          goto show_usage;
  154.       }
  155.    }
  156. #endif /* end of not OOZ */
  157.  
  158. #ifndef OOZ
  159.    /* if not doing a list and no extension in archive name, add default 
  160.    extension */
  161.    if (cmd != LIST && strchr("lvL", *option) == NULL &&
  162.          strchr(nameptr (zooname), EXT_CH) == NULL)
  163.       zooname = newcat (zooname, EXT_DFLT);
  164. #endif
  165.  
  166. #ifndef PORTABLE
  167. #ifndef OOZ
  168. /* only need to ensure integrity of created archive */
  169.    break_off();   /* break = off -- specific to MSDOS */
  170. #endif
  171. #endif
  172.  
  173. /* 
  174. Here we allocate a large block of memory for the duration of the program.
  175. lzc() and lzd() will use half of it each.  Routine getfile() will use all
  176. of it. 
  177. */
  178. /* fudge factor to avoid off-by-one errors */
  179. #define  FUDGE    10
  180.  
  181. /*                          fudge/2           fudge/2
  182. **             [______________||________________|]
  183. **               output buffer    input buffer
  184. */
  185.  
  186.    out_buf_adr = emalloc (OUT_BUF_SIZE + IN_BUF_SIZE + FUDGE);
  187.  
  188.    /* input buffer is in top of allocated block */
  189.    in_buf_adr = out_buf_adr + OUT_BUF_SIZE + (FUDGE/2);
  190.  
  191. #ifdef OOZ
  192. zooext(zooname, "\0");     /* just extract -- no fancy stuff   */
  193. exit (0);                  /* and exit normally                */
  194. #else
  195. /* else not OOZ -- parse command line and invoke a routine */
  196.    if (cmd != NONE) {
  197.       switch (cmd) {
  198.  
  199.          case ADD:      zooadd (zooname, filecount, &argv[3], "aP:"); break;
  200.          case FRESHEN:  zooadd (zooname, filecount, &argv[3], "auP:"); break;
  201.          case UPDATE:   zooadd (zooname, filecount, &argv[3], "aunP:"); break;
  202.          case MOVE:     zooadd (zooname, filecount, &argv[3], "aMP:"); break;
  203.  
  204.          case EXTRACT:  zooext (zooname, "x"); break;
  205.          case TEST:     zooext (zooname, "xNd"); break;
  206.          case PRINT:    zooext (zooname, "xp"); break;
  207.  
  208.          case DELETE:   zoodel (zooname, "DP",1); break;
  209.          case LIST:     zoolist (&argv[2], "v", argc-2); break;
  210.          case COMMENT:  comment (zooname, "c"); break;
  211.          default: goto show_usage;
  212.       }
  213.    } else
  214.       switch (*option) {
  215.          case 'a': 
  216.          case 'u':
  217.          case 'T':   
  218.             zooadd (zooname, filecount, &argv[3], option); break;
  219.          case 'D':
  220.             zoodel (zooname, option, 1); break;
  221.          case 'U':
  222.             zoodel (zooname, option, 0); break;
  223.          case 'v':
  224.          case 'l': 
  225.             zoolist(&argv[2], option, 1); break;
  226.          case 'L': 
  227.             zoolist(&argv[2], option, argc-2); break;
  228.          case 'e':
  229.          case 'x': 
  230.             zooext(zooname, option); break;
  231.          case 'P':
  232.             zoopack (zooname, option); break;
  233.          case 'c':
  234.             comment (zooname, option); break;
  235.          default:
  236.             goto give_list;
  237.       }
  238. exit (0);      /* don't fall through */
  239.  
  240. /* usage list including Novice commands */
  241. show_usage:
  242.    fprintf (stderr, "%s%s%s", usage, nov_usage, nov_cmds); exit (1);
  243.  
  244. /* brief usage list */
  245. give_list:
  246.     fprintf (stderr, usage); exit (1);
  247.  
  248. /* help screen */
  249. bigusage:
  250.  
  251. printf ("Zoo archiver, %s\n", version);
  252. printf("(C) Copyright 1986, 1987 Rahul Dhesi -- Noncommercial use permitted\n");
  253.  
  254. printf (usage);
  255. printf ("\nChoose a command from within {} and zero or more modifiers from within []\n");
  256.  
  257. printf ("E.g.:  `zoo a save /bin/*' will archive all files in /bin into save.zoo\n\n");
  258.  
  259. printf (" Commands in {} mean:         |Modifiers in [] mean:\n");
  260.  
  261. printf ("  a     add files             | a     show archive name(s) in listing\n");
  262. printf ("  c     update comments       | c     add/list comments\n");
  263. printf ("  D     delete stored files   | d     extract/list deleted files too\n");
  264. printf ("  e,x   extract files         | dd    extract/list only deleted files\n");
  265. printf ("  l,v,L list filenames        | E     erase backup after packing\n");
  266. printf ("  P     pack archive          | f     fast add (no compression) or list\n");
  267. printf ("  T     fix archive datestamp | M     move when adding (erase original)\n");
  268. printf ("  u     add only newer files  | n     add only files not already in archive\n");
  269. printf ("  U     undelete stored files | N     send extracted data to Neverland\n");
  270. printf (" -----------------------------  O,oo  don't ask \"Overwrite?\"\n");
  271. printf ("  q     be quiet                p     pipe extracted data to standard output\n");
  272. printf ("  :     don't store dir names   /,//  extract full pathnames\n");
  273. printf ("  .     pack to current dir     I     add filenames read from stdin\n");
  274.  
  275. #ifdef PORTABLE
  276. printf ("  P     pack after adding       @n    start extract/list at position n\n");
  277. /* nothing */
  278. #else
  279. printf ("  z     add/extract Z format    @n    start extract/list at position n\n");
  280. #endif /* ndef PORTABLE */
  281.  
  282.  
  283. printf (nov_usage);
  284. printf (nov_cmds);
  285. #endif /* end of not OOZ */
  286.  
  287. /* NOTE:  if allowed to fall through and return without an exit() statement,
  288.    it was printing garbage--corrupted stack?  Why--bug in Microsoft C? */
  289. exit (1);
  290. }
  291.